package cn.tedu.mybatis.mapper;

import cn.tedu.mybatis.pojo.*;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface BlogMapper {
    //@Insert("INSERT INTO blog(content,created,user_id) VALUES (#{content},#{created},#{userId})")
    int insert(Blog blog);
    //@Delete("DELETE FROM blog WHERE id=#{id}")
    int deleteById(Integer id);
    /*
    UPDATE blog
    SET content=?,created=?,user_id=?
    WHERE id=?
    ps.setString(1,blog.getContent());
    ps.....
     */
    //@Update("UPDATE blog SET content=#{content},created=#{created},user_id=#{userId} WHERE id=#{id}")
    int updateById(Blog blog);
    /*
    SELECT id,content,created,user_id
     *  FROM blog
     *  WHERE id=?
     *
     *  ResultSet rs = ps.executeQuery();
     *  if(rs.next()){
     *      Blog blog = new Blog();
     *      blog.setId(rs.getInt("id"));
     *      blog.setContent(rs.getString("content"));
     *      ...
     *      return blog;
     *  }
     *  return null;
     *
     *
     *  在MyBatis中，我们编写SELECT语句时，最终框架会自动将结果集的记录转换为一个
     *  实体对象(这里就是Blog对象)
     *  框架将结果集一条记录设置到Blog对象对应属性上的规则为:
     *  结果集的字段名应当与Blog类中属性名一样的会自动将值设置完毕
     *  如果结果集中字段名与Blog类中属性名不一致时，可以在SELECT子句中为该字段添加别名
     *  让别名与Blog类中的属性名一致即可。
     *
     *  例如:
     *  blog表中有一个字段:user_id
     *  而Blog类中该属性为:userId
     *  因此为了顺利的让框架将结果集中user_id的值设置到userId属性上，我们需要将SELECT语句写为:
     *  SELECT id,content,created,user_id userId ...
     *            ^^^^^^^                 ^^^^^^
     *            |||||||              别名与属性名一致即可
     *    这些字段本身与属性名一致会自动绑定


     */
    /*
    如果查询语句可以查询到多条记录时，我们定义的方法返回值类型应当是一个集合
    那么框架会将每条记录转变为一个Blog对象并将他们最终放到一个List集合然后返回
     *
     * 如果方法返回值类型定义为Blog类而非集合，那么执行时框架会抛出异常，告知问题:
     *
     * org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
     *                                                                                             太多结果集异常
     */
    //@Select("SELECT id,content,created,user_id userId FROM blog WHERE id=#{id}")
    Blog selectById(Integer id);
    //@Select("SELECT id,content,created,user_id userId FROM blog")
    List<Blog> selectAll();
    /*
    将来针对某些业务对应的页面展示微博的部分信息
    下面方法的返回值类型为BlogVO1，因此MyBatis框架在进行查询后会将结果集记录
    存入到BlogVO1对象将其返回
    绑定数据还是字段名与属性名一致，不一致的要用别名
     */
    //@Select("SELECT id,content,created,user_id userId FROM blog WHERE id=#{id} ")
    BlogVO1 selectBlogVO1(Integer id);
    //@Select("SELECT id,content,user_id userId FROM blog")
    List<BlogVO2> selectAllBlogVO2();
    //测试MyBatis的动态修改操作
    int dynamicUpdateBlogById(Blog blog);

    int dynamicDeleteBlogById(Integer[] ids);

    int dynamicDeleteBlogById2(List<Integer> ids);
    /*
    该方法的功能是根据微博的id查看微博信息
    用这个方法学习在XML针对返回的对象定义映射表ResultMap
     */
    BlogVO3 selectResultMap(Integer id);
    /*
    根据博客ID查看该博客信息和所有的评论信息
     */
    BlogVO4 selectBlogAndCommentById(Integer id);
    /*
    统计博客的记录数
     */
    int countBlog();
}
